package com.triple.triplerpc.utils;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.lang.Dict;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.setting.dialect.Props;
import cn.hutool.setting.yaml.YamlUtil;

import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;

/**
 * 配置工具类，读取配置文件 并 返回配置对象
 */
public class ConfigUtils {

    /**
     * 加载配置对象
     *
     * @param tClass
     * @param prefix
     * @param <T>
     * @return
     */
    public static <T> T loadConfig(Class<T> tClass, String prefix) {
        return loadConfig(tClass, prefix, "");
    }

    /**
     * 读取配置，支持区分环境
     *
     * @param tClass
     * @param prefix
     * @param environment
     * @param <T>
     * @return
     */
    public static <T> T loadConfig(Class<T> tClass, String prefix, String environment) {
        StringBuilder configFileBuilder = new StringBuilder("application");
        if (StrUtil.isNotBlank(environment)) {
            configFileBuilder.append("-").append(environment);
        }
        configFileBuilder.append(".properties");
        // 通过 Hutool 读取指定名称的配置文件中的部分配置信息, 并且转换成 Java 对象
        Props props = new Props(configFileBuilder.toString());
        return props.toBean(tClass, prefix);
    }

    /**
     * 读取 yml 配置，支持区分环境
     *
     * @param tClass
     * @param prefix
     * @param environment
     * @param <T>
     * @return
     */
    public static <T> T loadYmlConfig(Class<T> tClass, String prefix, String environment) {
        StringBuilder configFileBuilder = new StringBuilder("application");
        if (StrUtil.isNotBlank(environment)) {
            configFileBuilder.append("-").append(environment);
        }
        configFileBuilder.append(".yml");
        // configFileBuilder.append(".yaml");
        // 读取 yml, 返回的对象本质是一个 map
        Dict dict = YamlUtil.loadByPath(configFileBuilder.toString());
        // 返回对象类
        return BeanUtil.copyProperties(dict.getBean(prefix), tClass);
    }

}
